#!/usr/bin/python
# -*-coding:UTF-8 -*-

# ========================
# @Time  : 2021/2/8
# @Author: Sunny
# ========================

"""
__slots__:可以覆盖__dict__属性，只要这个类定义了__slots__这个属性，python就不会给这个类添加__dict__

功能：
    1.可以覆盖__dict__属性
    2.可以限制这个类的对象、属性的绑定

*注意：__slots__属性没办法被继承，只能在类里面使用

作用：如果一个类的属性数量特别多，当大量创建对象时，__dict__会每个对象的属性都会存储一遍，比较消耗内存空间，但是__slots__会覆盖__dict__属性
     只会有一个slots属性，所有的对象共用

应用场景：
    1.定义的类需要创建大量的对象，可以通过__slots__属性来指定对象属性，覆盖__dict__,减少内存开销
    2.要限定这个类的对象的属性(不包含类的属性)

"""
class MyTest:
    """自定义的类：文档注释"""
    __slots__ = ['name','age','gender' ]  #这里限制的是类对象的属性

    sex ='class属性'
    def __init__(self,age):
        self.age = age

    def func(self):
        print('func')

print(MyTest.__slots__)

m = MyTest(18)

# print(m.__dict__)  #会报错，类的对象的__dict__属性被__slots__覆盖，对象的__dict__属性就不存在了

# m.sex= 'musen' #会报错，提示sex为属性只可读，不可改，相当于对象属性被锁定了
# # m.sex1 = 'musen'  #也会报错，修改和新增属性都被限制了
# m.func()

# m2=MyTest(28)
# m3=MyTest(28)
# m4=MyTest(28)
# print(m.__slots__)


#str类，代码内部做了属性限制，所以通过对象来动态添加属性的时候，会报错
# s = str(111)
# s.name = 'musen'
# print(s.name)
